package zhongbo.java.air.monitor.task;

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import zhongbo.java.air.monitor.model.FlightActivityDaily;
import zhongbo.java.air.monitor.service.IFlightActivityDailyService;

import java.util.Date;
import java.util.List;

/**
 * 说明：
 *
 * @author 钟波dellNotebook
 * @since 2025年04月08日 星期二 04:12:59
 */
@Component
@Slf4j
public class AircraftActivityTask {

    @Autowired
    private IFlightActivityDailyService<FlightActivityDaily> flightActivityDailyService;

    // 每10分钟执行（注意配置时区）
    @Scheduled(
            // 开发中可设置短一点, 这里设置5分钟
            fixedDelay = 5 * 60 * 1000
            // 启动后等多少毫秒, 执行第一次定时任务, 这里设置5秒
            , initialDelay = 5000
    )
    public void updateDailyActivity() {
        log.info("---- 执行定时任务 -----");
        doJob();
    }

    private void doJob() {
        String today = DateUtil.formatDate(new Date());
        // 1. 从轨迹表查询当天出现过的ICAO码（需实现轨迹表查询逻辑）
        List<FlightActivityDaily> activeIcaoList = flightActivityDailyService.selectDailyStats(today);
        log.info("查询结果: {}条", activeIcaoList.size());
        // 2. 批量插入或更新
        // 更新补充飞机信息registration,airline,aircraft_type三个字段.
        for (FlightActivityDaily activityDaily : activeIcaoList) {
            flightActivityDailyService.fillDictForAirCraftInfo(activityDaily);
        }
        // to//do 周二任务: 存入数据库. 存入之前先icao+date两个字段, 判断数据库是否已有数据, 有的话则是更新
        for (FlightActivityDaily activeIcao : activeIcaoList) {
            String icaoCode = activeIcao.getIcaoCode();
            try {
                Date date = activeIcao.getDate();
                String formatDate = DateUtil.formatDate(date);
                FlightActivityDaily find = flightActivityDailyService.findOneByIcaoAndDate(icaoCode, formatDate);
                if (find == null) {
                    FlightActivityDaily add = flightActivityDailyService.add(activeIcao);
                    log.info("新增每日航迹活动信息: {}", add);
                } else {
                    String id = find.getId();
                    activeIcao.setId(id);
                    FlightActivityDaily edit = flightActivityDailyService.edit(activeIcao);
                    log.info("更新每日航迹活动信息: {}", edit);
                }
            } catch (Exception e) {
                log.error("更新每日航迹活动信息失败, icao: {}", icaoCode, e);
            }
        }
    }

}
